<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="../../lib/style.css">
<script type="text/javascript" src="../../lib/window.js"></script>
<title>文章类别列表</title>
</head>
<style>
body{ font-size:14px; line-height:150%; font-family:Garamonds,Tahoma; }
</style>
<body>



<div style="text-indent:2em">
    "文章类别"的相关<a target="_blank" href="4.文件创建及说明.html" style="color:#333;">文件创建</a>好了，那接下来就可以开始编写代码来实现"文章类别"模块的业务流程了。
</div>
<div style="text-indent:2em">
    "文章类别"模块的业务流程有四个：文章类别列表，增加文章类别，编辑文章类别，删除文章类别。其实这四个流程一开始我们就已经打好框架了，还记得 "<a target="_blank" href="3.添加模块和权限.html#lfm-articlecat-add-privilege" style="color:#333">添加模块和权限</a>" 时我们曾添加过四个权限：列表，增加，编辑，删除！这四个权限就是根据"文章类别"的业务流程的提炼出来的功能点。
</div>
<br />


<b>模块默认首页</b>
<div style="text-indent:2em">每一个模块都有一个默认首页，即点击左侧"模块菜单树"菜单项后显示在右侧"主显示区"的内容。(参见图1)</div>
<div style="text-align:center;padding:5px;"><img alt="图1" src="images/articlecat_list.gif" style="border:1px solid #ccc;"></div>
<div style="text-indent:2em">模块默认首页通常是列表数据的主要承载着，其次它还用于显示其他操作等。</div>
<br />


<b>1. 数据导入</b>
<div style="margin-left:1.2em;">
    <div style="text-indent:2em;">开发中总是会遇到各种问题，没有数据对于调试来说是很困难的，所以在文章类别列表开发之前导入以下SQL到数据库！</div>

    <div class="viewcode-body" style="margin-left:2.2em;">
        TRUNCATE TABLE article_cat;<br />
        INSERT INTO article_cat(article_cat_id,name,lft,rht,lvl) VALUES('1','虚根分类','1','8','0');<br />
        INSERT INTO article_cat(article_cat_id,name,lft,rht,lvl) VALUES('2','新闻','2','7','1');<br />
        INSERT INTO article_cat(article_cat_id,name,lft,rht,lvl) VALUES('3','娱乐新闻','3','4','2');<br />
        INSERT INTO article_cat(article_cat_id,name,lft,rht,lvl) VALUES('4','财经新闻','5','6','2');<br />
    </div>
</div>

<br />

<b id="lfm-articlecat-mlist-code-title">2. 模块文件的数据处理</b>
<div style="margin-left:1.2em;">
    <div style="text-indent:2em;">
        "文章类别"的模块文件包含以下功能点代码：增加('add')，增加提交('insert')，编辑('edit')，编辑提交('update')，删除('del')，列表('list')，模块默认首页('index')。每个功能点代码段通过 $_REQUEST['act'] 请求区分。
    </div>
    <div style="text-indent:2em;">
        列表('list')功能点包含了列表查询('query')子功能点，通过 $_REQUEST['actsub'] 标识。相比列表('list')功能点，列表查询('query')只负责返回列表的数据层HTML和分页HTML，而列表('list')则还要返回搜索层的HTML。
    </div>
    <div style="text-indent:2em;">
        列表('list')功能点和模块默认首页('index')功能点使用同一代码段，因为它们使用了同一数据：文章列表数据。模块默认首页('index')功能点还包括构建"模块标题层"的数据。
    </div>

    <br />
    <div style="text-indent:2em">在 "图1" 我们虽然没有发现 "文章类别" 列表的搜索和分页功能，但是它确实是一个列表，一个显示出了所有数据并进行缩进的列表。</div>
    <br />

    <div style="text-indent:2em;">
        拷贝<a href="javascript:void(0)" style="color:#333;" onclick="var o=document.getElementById('lfm-articlecat-mlist-code');o.style.display=o.style.display=='none'?'':'none'">以下代码</a>到 
        "文章列表"的<a target="_blank" href="4.文件创建及说明.html#lfm-articlecat-file-module" style="color:#333;">模块处理文件</a> /admin/modules/article/article_cat.php
    </div>
    <div class="viewcode-header" style="margin-left:2.2em;">
        <a href="javascript:void(0)" onclick="var o=document.getElementById('lfm-articlecat-mlist-code');o.style.display=o.style.display=='none'?'':'none'">View Code 1</a>
        <font style="color:#666"> - </font> 
        <a href="javascript:void(0)" style="color:#090;" onclick="explain_code('lfm-articlecat-mlist-code-explain')">代码解释</a> 
    </div>
    <div class="viewcode-body" style="margin-left:2.2em;display:none;border-top:0;" id="lfm-articlecat-mlist-code">
        <table>
        <tr>
            <td width="30">
                1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />
                11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />
                21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />
                31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />
                41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />
                51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />
                61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />
                71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />
                81<br />
            </td>
            <td>
                <script>document.write('&l'+'t;')</script>?php<br />
                /* 文件加载 */<br />
                require('../../includes/init.php');<br />
                require('../../includes/lib_lrtree.php');<br />
                require('../../includes/lib_article.php');<br />
                <br />
                /* 异步 - 其他模块 */<br />
                if( $_REQUEST['act'] == '...' ){<br />

                }<br />
                <br />
                /* 异步 - 默认首页，列表页 */<br />
                else{<br />
                <div style="margin-left:2em;">
                    /* 权限检查 */<br />
                    admin_privilege_valid('article_cat.php', 'list');<br />
                    <br />
                    /* 取得管理员的增加操作和非增加、列表操作 */<br />
                    $m_aa = admin_module_acts('article_cat.php');<br />
                    $m_ab = filter_module_acts($m_aa, array('add'), true);<br />
                    $m_ac = filter_module_acts($m_aa, array('add','list'), false);<br />
                    <br />
                    /* 文章类别列表 */<br />
                    $tpl['all'] = all_article_cat();<br />
                    <br />
                    /* 文章类别列表 - 数据重构，绑定权限 */<br />
                    foreach( $tpl['all'] AS $i =<script>document.write('&g'+'t;')</script> $r ){
                        <div style="margin-left:2em;">
                            $tpl['all'][$i]['pre']  = '<script>document.write('&l'+'t;')</script>span class="';<br />
                            $tpl['all'][$i]['pre'] .= ($r['rht']-$r['lft']  <script>document.write('&l'+'t;')</script> 1 ? 'plus' : 'minus') .'" style="';<br />
                            $tpl['all'][$i]['pre'] .= ($r['rht']-$r['lft']) <script>document.write('&g'+'t;')</script> 1 ? 'cursor:pointer;' : '';<br />
                            $tpl['all'][$i]['pre'] .= 'margin-left:'. intval($r['lvl']-$tpl['all'][0]['lvl'])*2 .'em;" ';<br />
                            $tpl['all'][$i]['pre'] .= 'onclick="tabletree_click(this)"<script>document.write('&g'+'t;')</script><script>document.write('&l'+'t;')</script>/span<script>document.write('&g'+'t;')</script>';<br />
                            <br />
                            /* 编辑操作 */<br />
                            $attribs = array();<br />
                            $attribs['edit']['onclick'] = "wnd_articlecat_fill(this,'edit',{$r[article_cat_id]})";<br />
                            <br />
                            /* 删除操作 */<br />
                            $del = "ListTable.del(this,{$r[article_cat_id]},'";<br />
                            $del.= f(sprintf($_LANG['spr_confirm_del'],$r['name']),'hstr') ."')";<br />
                            if( ($r['rht'] - $r['lft']) <script>document.write('&g'+'t;')</script> 1 ){
                                <div style="margin-left:2em;">
                                    $del = "wnd_confirm('警告！删除该分类将导致下级分类的删除！',{'ok':function(){". $del ."}})";
                                </div>
                            }<br />
                            $attribs['del']['onclick'] = $del;<br />
                            <br />
                            /* 绑定操作 */<br />
                            $tpl['all'][$i]['acts'] .= format_module_acts($m_ac, $attribs, 'a');
                        </div>
                    }<br />
                    <br />
                    /* 初始化页面信息 */<br />
                    $tpl['_body'] = 'list';<br />
                    <br />
                    <br />
                    /* 异步 - 列表页，列表查询 */<br />
                    if( $_REQUEST['act'] == 'list' ){<br />
                        <div style="margin-left:2em;">
                            /* 列表查询 */<br />
                            if( $_REQUEST['actsub'] == 'query' ){
                                <div style="margin-left:2em;">
                                    /* 初始化页面信息 */<br />
                                    $tpl['_bodysub'] = 'query';
                                </div>
                            }<br />
                            <br />
                            /* 返回JSON */<br />
                            make_json_ok( '', tpl_fetch('article_cat.html',$tpl) );
                        </div>
                    }
                    <br />
                    <br />
                    /* 异步 - 默认首页 */<br />
                    else{<br />
                        <div style="margin-left:2em;">
                            /* 初始化页面信息 */<br />
                            $tpl['_header'] = 'title';<br />
                            <br />
                            /* 操作属性 */<br />
                            $attribs = array();<br />
                            $attribs['add']['onclick'] = "wnd_articlecat_fill(this,'add')";<br />
                            <br />
                            /* 初始化页面信息 */<br />
                            $tpl['title'] = admin_privilege_name_fk('article_cat.php', 'list'); //权限名称<br />
                            $tpl['titleacts'] = format_module_acts($m_ab, $attribs, 'btn'); //格式化模块的操作(非内嵌)
                        </div>
                    }
                    </div>
                </div>
                }<br />
                <br />
                /* 加载视图 */<br />
                include($_CFG['DIR_ADMIN_TPL'].'article_cat.html');<br />
                ?<script>document.write('&g'+'t;')</script>
            </td>
        </tr>
        </table>
    </div>

    <div style="display:none" id="lfm-articlecat-mlist-code-explain">
        <table style="font-size:12px;">
        <tr>
            <td style="text-align:right;width:50px;">
                14行<br />
                <br />
                17行<br />
                18行<br />
                19行<br />
                <br />
                22行<br />
                25行<br />
                26-30行<br />
                34行<br />
                37-42行<br />
                45行<br />
                <br />
                49行<br />
                53行<br />
                55行<br />
                57行<br />
                61行<br />
                <br />
                67行<br />
                71行<br />
                <br />
                74行<br />
                75行<br />
                80行<br />
            </td>
            <td>
                检查当前管理员是否拥有文章类别列表权限<br />
                <br />
                获取当前管理员拥有文章类别的所有权限<br />
                在当前管理员拥有文章类别的所有权限中查找增加权限，用于<a target="_blank" href="../../开发指南(PHP)/权限系统/权限篇.html#lfm-privilege-dev-titleact-title" style="color:#333">独立权限</a><br />
                在当前管理员拥有文章类别的所有权限中查找非增加、列表权限，用于<a target="_blank" href="../../开发指南(PHP)/权限系统/权限篇.html#lfm-privilege-dev-bind-title" style="color:#333">绑定权限</a><br />
                <br />
                获取所有文章类别数据，用于表格树的建立<br />
                循环遍历文章类别数据，重构数据，绑定权限<br />
                格式化表格树的缩进前辍，即构造树的展开和缩进图标<br />
                设置编辑操作的onclick属性，'edit'代表权限操作码,'onclick'表示HTML的标签属性<br />
                设置删除操作的onclick属性，'del'代表权限操作码,'onclick'表示HTML的标签属性<br />
                构造绑定权限到每条记录，'a'代表操作类型为超链接'A';<br />
                <br />
                设置读取视图文件的列表代码块<br />
                列表和列表查询功能点的处理代码<br />
                列表查询功能点的处理代码<br />
                设置读取视图文件的列表查询代码块<br />
                返回HTML代码<br />
                <br />
                设置读取视图文件 header.html 中 'title' 的HTML代码块（即"模块标题层"HTML代码块）<br />
                设置增加操作的onclick属性，'add'代表权限操作码,'onclick'表示HTML的标签属性<br />
                <br />
                构建 "模块标题层" 的操作按钮(独立权限)，'btn'代表操作类型为按钮<br />
                构建 "模块标题层" 的标题，这里使用文章类别列表的权限名称作为标题<br />
                加载视图<br />
            </td>
        </tr>
        </table>
    </div>
</div>

<br />

<b id="lfm-articlecat-llist-code-title">3. 库文件的数据处理</b>
<div style="margin-left:1.2em;">
    <div style="text-indent:2em;">
        在 "View Code 1" 中我们使用了一个封装的函数 all_article_cat() - 22行。该函数主要功能就是获取所有文章类别数据。
    </div>
    <br />

    <div style="text-indent:2em;">
        拷贝<a href="javascript:void(0)" style="color:#333;" onclick="var o=document.getElementById('lfm-articlecat-llist-code');o.style.display=o.style.display=='none'?'':'none'">以下代码</a>到<a target="_blank" href="4.文件创建及说明.html#lfm-articlecat-file-lib" style="color:#333;">库文件</a> /admin/includes/lib_article.php
    </div>

    <div class="viewcode-header" style="margin-left:2.2em;"><a href="javascript:void(0)" onclick="var o=document.getElementById('lfm-articlecat-llist-code');o.style.display=o.style.display=='none'?'':'none'">View Code 2</a></div>
    <div class="viewcode-body" style="margin-left:2.2em;display:none;border-top:0;" id="lfm-articlecat-llist-code">
        <script>document.write('&l'+'t;')</script>?php<br />
        /* 取得所有文章类别 */<br />
        function all_article_cat( $filter = array() )<br />
        {<br />
            <div style="margin-left:2em;">
                /* 所有文章类别 */<br />
                if( empty($filter) ){<br />
                    <div style="margin-left:2em;">
                        $sql = 'SELECT * FROM '. tname('article_cat'). ' WHERE article_cat_id <> 1 ORDER BY lft ASC';<br />
                        return $GLOBALS['db']->getAll($sql);<br />
                    </div>
                }<br />
                <br />
                /* 根据文章类别IDS取得文章类别信息 */<br />
                if( is_array($filter['article_cat_ids']) && !empty($filter['article_cat_ids']) ){<br />
                    <div style="margin-left:2em;">
                        $sql = ' SELECT * FROM '. tname('article_cat');<br />
                        $sql.= ' WHERE article_cat_id <> 1 AND article_cat_id IN("'. implode('","',$filter['article_cat_ids']) .'") ORDER BY lft ASC';<br />
                        return $GLOBALS['db']->getAll($sql);<br />
                    </div>
                }<br />

                return array();<br />
            </div>
        }<br />
        ?<script>document.write('&g'+'t;')</script><br />
    </div>
</div>

<br />

<b id="lfm-articlecat-vlist-code-title">4. 视图文件的数据处理</b>
<div style="margin-left:1.2em;">
    <div style="text-indent:2em;">
        同模块文件结构一样，每个功能点基本上都有一个对应的视图文件代码段，通过 $tpl['_body'] 区分。
    </div>
    <br />
    <div style="text-indent:2em;">
        拷贝<a href="javascript:void(0)" style="color:#333;" onclick="var o=document.getElementById('lfm-articlecat-vlist-code');o.style.display=o.style.display=='none'?'':'none'">以下代码</a>到<a target="_blank" href="4.文件创建及说明.html#lfm-articlecat-file-view" style="color:#333;">视图文件</a> /admin/template/article_cat.html
    </div>

    <div class="viewcode-header" style="margin-left:2.2em;">
        <a href="javascript:void(0)" onclick="var o=document.getElementById('lfm-articlecat-vlist-code');o.style.display=o.style.display=='none'?'':'none'">View Code 3</a>
        <font style="color:#666"> - </font> 
        <a href="javascript:void(0)" style="color:#090;" onclick="explain_code('lfm-articlecat-vlist-code-explain')">代码解释</a> 
    </div>

    <div class="viewcode-body" style="margin-left:2.2em;display:none;border-top:0;" id="lfm-articlecat-vlist-code">
        <table style="table-layout:fixed;">
        <tr>
            <td width="30">
                1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />
                11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />
                21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />
                31<br />32
            </td>
            <td style="white-space:nowrap;">
                <script>document.write('&l'+'t;')</script>?php if( $tpl['_header'] ){ include($_CFG['DIR_ADMIN_TPL'].'header.html'); }?<script>document.write('&g'+'t;')</script><br />
                <br />
                <br />
                <script>document.write('&l'+'t;')</script>?php if( $tpl['_body'] == 'list' ){ ?<script>document.write('&g'+'t;')</script><br />
                    <br />
                    <div style="margin-left:2em;">
                    <script>document.write('&l'+'t;')</script>?php if( $tpl['_bodysub'] != 'query' ){?<script>document.write('&g'+'t;')</script><br />
                    <script>document.write('&l'+'t;')</script>div class="listtable-div" id="listtable-articlecat" onmouseover="ListTable.init(this.id,'modules/article/article_cat.php','?act=list');"<script>document.write('&g'+'t;')</script><br />
                    <div style="margin-left:2em;">
                        <script>document.write('&l'+'t;')</script>div class="listtable-data" style="border-top:0;border-bottom:0;"<script>document.write('&g'+'t;')</script><br />
                    </div>
                    <script>document.write('&l'+'t;')</script>?php }?<script>document.write('&g'+'t;')</script><br />
                    <div style="margin-left:4em;">
                    <br />
                            <script>document.write('&l'+'t;')</script>table class="listtable-table" onmouseover="TableAct.moveHiLight(this);TableAct.choiceHiLight(this);"<script>document.write('&g'+'t;')</script><br />
                            <script>document.write('&l'+'t;')</script>tr<script>document.write('&g'+'t;')</script><br />
                            <div style="margin-left:2em;">
                                <script>document.write('&l'+'t;')</script>th width="10%"<script>document.write('&g'+'t;')</script>标识<script>document.write('&l'+'t;')</script>/th<script>document.write('&g'+'t;')</script><br />
                                <script>document.write('&l'+'t;')</script>th width="70%"<script>document.write('&g'+'t;')</script>文章类别名<script>document.write('&l'+'t;')</script>/th<script>document.write('&g'+'t;')</script><br />
                                <script>document.write('&l'+'t;')</script>th width="20%"<script>document.write('&g'+'t;')</script>操作<script>document.write('&l'+'t;')</script>/th<script>document.write('&g'+'t;')</script><br />
                            </div>
                            <script>document.write('&l'+'t;')</script>/tr<script>document.write('&g'+'t;')</script><br />
                            <script>document.write('&l'+'t;')</script>?php foreach( $tpl['all'] AS $r ){?<script>document.write('&g'+'t;')</script><br />
                            <script>document.write('&l'+'t;')</script>tr class="<script>document.write('&l'+'t;')</script>?php echo $r['lvl']; ?<script>document.write('&g'+'t;')</script>" align="center"<script>document.write('&g'+'t;')</script><br />
                            <div style="margin-left:2em;">
                                <script>document.write('&l'+'t;')</script>td<script>document.write('&g'+'t;')</script><script>document.write('&l'+'t;')</script>?php echo $r['article_cat_id']; ?<script>document.write('&g'+'t;')</script><script>document.write('&l'+'t;')</script>/td<script>document.write('&g'+'t;')</script><br />
                                <script>document.write('&l'+'t;')</script>td align="left" <script>document.write('&g'+'t;')</script><script>document.write('&l'+'t;')</script>?php echo $r['pre'].f($r['name'],'html'); ?<script>document.write('&g'+'t;')</script><script>document.write('&l'+'t;')</script>/td<script>document.write('&g'+'t;')</script><br />
                                <script>document.write('&l'+'t;')</script>td class="action"<script>document.write('&g'+'t;')</script><script>document.write('&l'+'t;')</script>?php echo $r['acts']; ?<script>document.write('&g'+'t;')</script><script>document.write('&l'+'t;')</script>/td<script>document.write('&g'+'t;')</script><br />
                            </div>
                            <script>document.write('&l'+'t;')</script>/tr<script>document.write('&g'+'t;')</script><br />
                            <script>document.write('&l'+'t;')</script>?php }?<script>document.write('&g'+'t;')</script><br />
                            <script>document.write('&l'+'t;')</script>/table<script>document.write('&g'+'t;')</script><br />
                    <br />
                    </div>
                    <script>document.write('&l'+'t;')</script>?php if( $tpl['_bodysub'] != 'query' ){?<script>document.write('&g'+'t;')</script><br />
                    <div style="margin-left:2em;">
                        <script>document.write('&l'+'t;')</script>/div<script>document.write('&g'+'t;')</script><br />
                    </div>
                    <script>document.write('&l'+'t;')</script>/div<script>document.write('&g'+'t;')</script><br />
                    <script>document.write('&l'+'t;')</script>?php }?<script>document.write('&g'+'t;')</script><br />
                    </div>
                <br />
                <br />
                <script>document.write('&l'+'t;')</script>?php } ?<script>document.write('&g'+'t;')</script><br />
            </td>
        </tr>
        </table>
    </div>

    <div style="display:none" id="lfm-articlecat-vlist-code-explain">
        <table style="font-size:12px;">
        <tr>
            <td style="text-align:right;width:50px;">
                1行<br />
                <br />
                4行<br />
                <br />
                7行<br />
                8行<br />
                11-24行<br />
            </td>
            <td>
                视图头部公用文件，包含"模块标题层"代码块<br />
                <br />
                视图文件的列表代码块<br />
                <br />
                视图文件的列表BOX层，onmouseover表示绑定并激活列表的功能<br/>
                视图文件的列表数据层<br/>
                视图文件的列表查询代码块(列表数据层的数据表)<br />
            </td>
        </tr>
        </table>
    </div>
</div>

<script>
function hash2title( hash )
{
    obj = hash.replace('#','').replace(/-title$/,'');
    obj = document.getElementById(obj);
    obj ? obj.style.display = '' : '';
}

hash2title(window.location.hash);

function explain_code( id )
{
    var wnd = Wnds.find(id);

    if( !wnd ){
        wnd = new Wnd(id, null, {'width':660,'height':420,'overflow':100,'overlay':false});

        wnd.create();
        wnd.buttonAddDefault('ok');

        wnd.title('代码解释');
        wnd.inner(document.getElementById(id).innerHTML, 'html');
    }

    wnd.show();
    wnd.moved();
    wnd.buttonActive('ok', function(e){if(e.keyCode==27)this.cannel()});
}
</script>


</body>
</html>
